var name = 'window'
var person1 = {
    name: 'person',
    foo1: function () {
        console.log(this.name);
    },
    foo2: ()=> {
        console.log(this.name);
    },
    foo3: function() {
        return function () {
            console.log(this.name);
        }
    },
    foo4: function () {
        return ()=> {
            console.log(this.name);
        }
    }
}
var person2 = {name: 'person2'};

person1.foo1(); // person
person1.foo1.call(person2); // person2

person1.foo2();  // window
person1.foo2.call(person2); // window

person1.foo3()(); // window
person1.foo3.call(person2)(); // window
person1.foo3().call(person2); // person2

person1.foo4()(); // person
person1.foo4.call(person2)(); // person2
person1.foo4().call(person2); // person2

// 注意，要在浏览器上跑，因为node环境没有window
// 箭头函数没有this
// 属性foo1 属于普通函数，this指向是 .前面的那个
// call 会直接触发函数并且把this指向转移到我们传入的对象中

// 属性foo2 属于箭头函数，没有this，this取执行时当前作用域的this
// 所以只要我们是在windows下执行的函数this都是指向window

// 属性foo3 属于返回一个普通函数
// 可以通过 .前面判断this指向
// person1.foo3()(); 逐步拆解，在foo3中this指向person，但是返回的
// 函数是个普通函数，this指向调用它的人（window）
// person1.foo3.call(person2)(); 一样的套路
// person1.foo3().call(person2); 这里把返回的函数中的this指向person

// 属性foo4 属于返回一个箭头函数
// person1.foo4()(); 因为 foo4的this是person1，所以返回的函数this指向person1
// person1.foo4.call(person2)(); 因为foo4的this被call指向了person2
// 箭头函数不能被call影响this指向

